Gradient boosting(boosting)

그레디언트 부스팅(gradient boosting)
에이다 부스팅과 그레이디언트 부스팅은 전반적인 개념은 같다.
(깊이가 1인)약한 학습기를 부스팅하여 강렬한 모델을 만든다.
하지만 가중치를 업데이트하는 방법과 (약한) 학습기를 연결하는 방법이 다르다.

그레디언트 부스팅은 기반 최적화에 익숙하다.

사이킷런에는 GradientBoostingClassifier 클래스에 이어 XGBoost보다도 빠른
그레디언트 부스팅 구현인 HistGradientBoostingClassifier도 추가 되어 있다.
그레디언트 부스팅은 에이다부스트와 달리 이전의 약한 학습기가 만든
잔차 오차(residual error)에 대해 학습하는 새로운 학습기를 추가한다.

그레디언트 부스팅은 신경망 알고리즘이 잘 맞는 이미지, 텍스트 같은 데이터를 제외하고
구조적 데이터셋에서 현재 가장 높은 성능을 내는 알고리즘 중 하나이다.
from sklearn.ensemble import GradientBoostingClassifier
gbrt=GradientBoostingClassifier(n_estimators=20, random_state=42)
gbrt.fit(X_train, y_train)
gbrt_train_score=gbrt.score(X_train, y_train)
gbrt_test_score=gbrt.score(X_test, y_test)
print(' / : %.3f/%.3f' %(gbrt_train_score, gbrt_test_score))

그레이디언트 부스팅의 훈련 정확도/테스트 정확도: 1.000/0.917

20개의 트리를 사용해서 에이다부스트 모델과 동일한 성능을 얻었다.
learning_rate 매개변수의 값이 작으면 성능을 좋아지지만 더 많은 트리가 필요하다.
default 값은 0.1이다.

그레디언트 부스팅이 사용하는 손실 함수는 loss 매개변수를 지정한다.
GradientBoostingClassifier일 경우 로지스틱 회귀를 의미하는 ‘deviance’
GradentBoostingRegressor의 경우 최소 제곱을 의미하는 ‘ls’가 default 값이다.

그레디언트 부스팅이 오차를 학습하기 위해 사용하는 학습기는 DecisionTreeRegressor이다.
DecisionTreeRegressor의 불순도 조건은 ‘mse’, ‘mae’ 등이다.
그레디언트 부스팅의 criterion 매개변수도 DecisionTreeRegressor의 불순도 조건에 따라
‘mse’, ‘mae’, ‘friedman_mse’(기본값)를 사용한다.
(‘mae’는 성능이 좋지 않아서 삭제(0.26) 예정)

subsample 매개변수를 기본값 1.0보다 작은 값으로 지정하면 훈련 데이터셋에서 subsample 매개변수에 지정된
비율만큼 랜덤하게 샘플링하여 트리를 훈련한다. == 확률적 그레이디언트 부스팅
이는 과대적합을 줄이는데 효과적이다.

subsample 매개변수가 1.0보다 작을 때, 그레이디언트 부스팅 객체의 oob_improvement_ 속성에
이전 트리의 OOB 손실 값에서 현재 트리의 OOB 손실을 뺀 값이 기록되어 있다.
gbrt=GradientBoostingClassifier(n_estimartors=100, subsample=0.5, random_state=1)
gbrt.fit(X_train, y_train)
oob_loss=np.cumsum(-gbrt.oob_improvement_)
plt.plot(range(100, oob_loss)
plt.xlabel('number of trees')
plt.ylabel('loss')
plt.show()
오류 발생
사이킷런 0.20버전부터 그레이디언트 부스팅에 조기 종료(early stopping) 기능을 지원하기 위한
매개변수 n_iter_no_change, validation_fraction, tol이 추가되었다.

훈련데이터에서 validation_fraction 비율(기본값 0.1)만큼 떼어 내어 측정한 손실이 n_iter_no_change 반복 동안
tol 값(기본값 1e-4)이상 향상되지 않으면 훈련을 종료

히스토그램 기반 부스팅은 입력 특성을 256개의 구간으로 나누어 노드를 분할에 사용한다.
일반적으로 샘플 개수가 1만 개보다 많은 경우 그레이디언트 부스팅보다 히스토그램 기반 부스팅이 더 빠르다.
HistGradientBoostingClassifier
아직 실험적
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGrdientBoostingClassifier
hgbc=HistGradientBoostingClassifier(random_state=1)
hgbc.fit(X_train, y_train)
hgbc_train_score=gbrt.score(X_train, y_train)
hgbc_test_score=gbrt.score(X_test, y_test)
print(' / : %.3f/%.3f' %(hgbc_train_score, hgbc_test_score))

그레이디언트 부스팅 훈련 정확도/테스트 정확도: 1.000/0.917

사이킷런 0.24부터 HistGradientBoostingClassifier와 HistGradientBoostingRegressor에서 범주형 특성을
있는 그대로 사용할 수 있다. categorical_features 매개변수에 불리언 배열이나 정수 인덱스 배열을 전달하여
범주형 특성을 알려주어야 한다.
XGBoost
pip3 install xgboost

XGboost에서도 tree_method 매개변수를 ‘hist’로 지정하여 히스토그램 기반 부스팅을 사용할 수 있다.
from xgboost import XGBClassifier
xgb=XGBClassifier(Tree_mothed='hist', random_state=1)
xgb.fit(X_train, y_train)
xgb_train_score=sgb.score(X_train, y_train)
xgb_test_score=xgb.score(X_test, y_test)
print('XGBoost / : %.3f/%.3f' %(xgb_train_score, xgb_test_score))
xgboost import 실패
LightGBM(MS)
pip3 install lightgbm
from lightgbm import LGBMClassifier
lgb=LGBMClassifier(random_state=1)
lgb.fit(X_train, y_train)
lgb_train_score=lgb.score(X_train, y_train)
lgb_test_score=lgb.score(X_test, y_test)
print('LightGBM : %.3f/%.3f' %(lgb_train_score, lgb_test_score))
lightgbm import 실패